/**
 * 异步从指定 URL 获取 Markdown 文件内容，并对内容进行格式化处理
 *
 * 支持控制是否移除换行符，最终会将多个连续空白字符替换为单个空格
 *
 * @param {string} url - Markdown 文件的 URL 地址
 *
 * @param {boolean} [removeNewLines=false] - 是否剔除换行符，默认不剔除
 *
 * @returns {Promise<string>} - 解析并格式化后的 Markdown 文件内容
 *
 * @throws {Error} - 当网络请求失败时抛出错误
 */
async function fetchMarkdown(url, removeNewLines = false) {
	/**
	 * 发送网络请求，获取指定 URL 的 Markdown 文件内容
	 */
	const response = await fetch(url);
	// 检查响应状态，判断请求是否成功
	if (response.ok) {
		/**
		 * 从响应中获取 Markdown 文件的字符串属性
		 */
		const markdown = await response.text();
		// 初始化处理后的 Markdown 内容
		let processedMarkdown = markdown;
		// 根据参数决定是否移除换行符
		if (removeNewLines) processedMarkdown = processedMarkdown.replace(/[\r\n]+/g, '');
		// 将多个连续的空格或制表符替换为单个空格，并返回处理结果
		return processedMarkdown.replace(/[ \t]+/g, ' ');
	}
	else {
		// 请求失败时，显示系统状态提示，告知用户 Markdown 文件加载失败的原因
		showSystemMessage('markdown文件 加载失败: ' + response.statusText, "error");
		// 抛出网络请求失败的错误
		throw new Error("网络请求失败");
	}
};

/**
 * 使用 Fetch API 异步保存文件到服务器
 *
 * @param {Blob|File|FormData|string} fileData - 要保存的文件数据
 *
 * @param {string} fileName - 文件名
 *
 * @param {boolean} [overwrite=false] - 是否覆盖已存在的文件，默认为 false
 *
 * @returns {Promise<Object>} - 包含保存结果的 Promise，成功时返回服务器响应的 JSON 数据
 *
 * @throws {Error} - 当文件保存失败时抛出错误
 */
async function saveFileWithFetch(fileData, fileName, overwrite = false) {
	try {
		/**
		 * 移除文件名中可能导致路径问题的特殊字符，将其替换为空格
		 */
		const safeFileName = fileName.replace(/[:*?"<>|]/g, '_');
		/**
		 * 发起 POST 请求，将文件数据保存到服务器
		 */
		const response = await fetch('/save',
			{
				method: 'POST',
				// 设置请求头，包含编码后的文件名和是否覆盖的标志
				headers: {
					'X-File-Name': toBtoaString(safeFileName),
					'X-Overwrite': overwrite.toString()
				},
				body: fileData
			}
		);
		// 检查响应状态，若请求失败则抛出错误
		if (!response.ok) throw new Error(response.status);
		/**
		 * 解析服务器返回的 JSON 数据
		 */
		const result = await response.json();
		// 显示系统消息，告知用户文件保存成功及保存的文件名
		showSystemMessage(`文件保存成功: ${result.filename}`, "success");
		return result;
	}
	catch (error) {
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		throw error;
	}
};

/**
 * 显示或隐藏文件导入覆盖层
 *
 * @param {Element} container - 包含聊天历史面板的容器元素
 *
 * @param {boolean} [display=true] - 是否显示覆盖层，默认为 true
 */
function displayImportOverlay(container, display = true) {
	/**
	 * 获取拖拽区域覆盖层元素
	 */
	let overlay = container.querySelector('.drop-zone-overlay');
	// 若覆盖层不存在，则创建一个新的覆盖层元素
	if (!overlay) {
		// 创建一个 div 元素，用于作为拖拽区域的覆盖层
		overlay = document.createElement('div');
		// 为新创建的 div 元素设置类名，便于后续样式控制
		overlay.className = 'drop-zone-overlay';
		// 向覆盖层中插入 HTML 内容，包含一个文件导入图标，设置图标字体大小并添加底部边距
		overlay.innerHTML = `<div style="font-size: 150px; margin-bottom: 16px;"><i class="fas fa-file-import"> 导入文件</i></div><div style="font-size: 24px;">月华目前暂不支持 PDF/PPT/EXE/ZIP 等格式哦</div>`;
		// 将创建好的覆盖层元素添加到容器中
		container.appendChild(overlay);
	}
	// 显示拖拽区域覆盖层
	if (display) overlay.style.display = 'flex';
	// 若 display 为 false，则隐藏覆盖层
	else overlay.style.display = 'none';
};